// 此文件封装了Ajax请求方式------axios
import axios from 'axios'
import { Message } from 'element-ui'
// 引入store
import store from '@/store'
import router from '@/router'
// import store from '@/store'
// import { getToken } from '@/utils/auth'

// create an axios instance
const service = axios.create({
  // 这里需要注意,这是固定写法,根据服务不同,基地址也不相同,当处于开发环境时,则调用开发环境设置好的地址,而这些信息都保存在项目根目录的env文件中,根据环境不同,调用文件也不同
  // process是Node的全局变量,提供当前Node.js进程的信息
  // process.env属性返回一个包含用户环境信息的对象
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // 临时设置基地址
  // baseURL: 'http://ihrm-java.itheima.net',
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// 初始化axios拦截器
// 添加请求拦截器
service.interceptors.request.use(function(config) {
  // 在发送请求之前做些什么
  // 获取token
  const token = store.state.user.token
  // 如果token不为空,就执行
  if (token) {
    // 统一配置请求头
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, function(error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
service.interceptors.response.use(function(response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  // 判断返回数据
  if (response.data.success) {
    return response.data
  } else {
    // 只有超出200范围的状态,才会执行错误回调
    // 所以此处通过判断返回的数据,来决定什么时候返回错误信息
    Message({
      message: response.data.message,
      type: 'warning',
      duration: 2000
    })
    // 为何此处需要抛出? 以后会基于错误进行处理
    return Promise.reject(response.data.message)
  }
}, function(error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  if (error?.response?.data?.code === 10002) {
    // 说明时token过期了,此时调用退出action
    store.dispatch('user/logout')
    // 跳转页面到登录页
    router.push('/login')
    return Message({
      message: '登录已过期,请重新登录',
      type: 'warning',
      duration: 2000
    })
  }
  Message({
    message: error.message,
    type: 'warning',
    duration: 2000
  })
  return Promise.reject(error)
})

export default service
